package com.cskaoyan.javase.array._6variable;

/**
 * 可变参数是Java1.5版本的新特性
 * 可变参数的语法:
 *      [修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
 *          //方法体
 *      }
 *      其中 数据类型... 变量名 表示可变参数
 *
 * 可变参数的本质是对应数据类型的数组,在方法体中,完全可以把可变参数当成一个数组使用,而在调用方法时,也可以传入数组.当然一般我们不会传入数组,而是直接写不确定个数的该数据类型变量.
 *
 * 可变参数并不是什么高深的语法,它不过是一种"语法糖"
 * 在方法调用时,编译器会自动将实参列表中的不确定个数的变量封装成一个数组对象,它的本质和直接传入数组没有任何区别
 *
 * 区别在于: 原先的数组是程序员自己创建的
 *          可变参数的数组是编译器帮助创建的
 * 像这种实现原理不变,但是简化了程序员的操作,让代码更灵活的语言特性就是可变参数
 *
 * @since 16:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        /*
            下列方法使用数组作为方法的形参,是可以实现功能的,但是不是我最想要的效果
            我希望: 能够在方法调用时,想传入几个int参数就传入几个
            这时就需要使用可变参数
         */
        System.out.println(sum(arr));
        System.out.println(sum(1, 2));
        System.out.println(sum(1, 2, 3));
        System.out.println(sum(1, 2, 3, 4));
        System.out.println(sum(1, 2, 3, 4, 5));

        System.out.println(getMax(1, 222.2, 3, 4, 5, 6, 7, 100.0));
    }

    // 需求: 求不确定个数的int类型数的和
    // 这时方法需要传入一个存放int数值的容器,可以使用int数组
    /*public static int sum(int[] arr) {
        // 遍历数组求和
        int sumValue = 0;
        for (int ele : arr) {
            sumValue += ele;
        }
        return sumValue;
    }*/
    // 'sum(int...)' is already defined in 'com.cskaoyan.javase.array._6variable.Demo'
    public static int sum(int... var) {
        // 遍历数组求和
        int sumValue = 0;
        for (int ele : var) {
            sumValue += ele;
        }
        return sumValue;
    }

    // 求不确定个数double类型数值的最小值
    public static double getMax(double... var) {
        double max = var[0];
        for (double ele : var) {
            if (ele > max) {
                max = ele;
            }
        }
        return max;
    }
}
